import rateLimit from 'express-rate-limit';
import config from '../config/index.js';

// 通用速率限制
export const rateLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 1000, // 每个IP最多1000次请求
  message: {
    success: false,
    message: '请求过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 短信发送速率限制 - 全局限制
export const smsGlobalLimiter = rateLimit({
  windowMs: 60 * 1000, // 1分钟
  max: config.sms.rateLimit.global, // 全局每分钟120次
  message: {
    success: false,
    message: '短信发送过于频繁，请稍后再试'
  },
  keyGenerator: () => 'sms_global', // 全局键
  standardHeaders: true,
  legacyHeaders: false
});

// 短信发送速率限制 - 单IP限制
export const smsIpLimiter = rateLimit({
  windowMs: 60 * 1000, // 1分钟
  max: config.sms.rateLimit.perIp, // 单IP每分钟3次
  message: {
    success: false,
    message: '您的短信发送过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 登录速率限制
export const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 5, // 每个IP最多5次登录尝试
  message: {
    success: false,
    message: '登录尝试过于频繁，请15分钟后再试'
  },
  skipSuccessfulRequests: true, // 成功的请求不计入限制
  standardHeaders: true,
  legacyHeaders: false
});

// 注册速率限制
export const registerLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1小时
  max: 3, // 每个IP每小时最多3次注册
  message: {
    success: false,
    message: '注册过于频繁，请1小时后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// API调用速率限制
export const apiLimiter = rateLimit({
  windowMs: 60 * 1000, // 1分钟
  max: 100, // 每个IP每分钟最多100次API调用
  message: {
    success: false,
    message: 'API调用过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 问答提交速率限制
export const questionLimiter = rateLimit({
  windowMs: 60 * 1000, // 1分钟
  max: 10, // 每个IP每分钟最多10次问答提交
  message: {
    success: false,
    message: '提问过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 文件上传速率限制
export const uploadLimiter = rateLimit({
  windowMs: 60 * 1000, // 1分钟
  max: 20, // 每个IP每分钟最多20次文件上传
  message: {
    success: false,
    message: '文件上传过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 管理后台速率限制
export const adminLimiter = rateLimit({
  windowMs: 60 * 1000, // 1分钟
  max: 200, // 每个IP每分钟最多200次管理后台请求
  message: {
    success: false,
    message: '管理后台请求过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 创建自定义速率限制器
export const createCustomLimiter = (options) => {
  const defaultOptions = {
    windowMs: 60 * 1000,
    max: 100,
    message: {
      success: false,
      message: '请求过于频繁，请稍后再试'
    },
    standardHeaders: true,
    legacyHeaders: false
  };

  return rateLimit({ ...defaultOptions, ...options });
};

// 基于用户的速率限制
export const createUserBasedLimiter = (options) => {
  return createCustomLimiter({
    ...options,
    keyGenerator: (req) => {
      // 如果用户已登录，使用用户ID作为键，否则使用IP
      return req.user ? `user_${req.user.id}` : req.ip;
    }
  });
};
